package com.cskaoyan.javase.oop3._1interface._2extend;

/**
 * Java8及其以后的接口中,允许定义两种实现方法:
 *      1.默认方法,对应关键字default,可以看成接口当中的成员方法,可以给接口的实现类对象去使用
 *          跟抽象类中的成员方法一样,当接口的所有实现类都需要一个默认的实现方法时,可以考虑定义默认方法
 *          这种实现方法就不会强制子类实现了,子类可以直接继承使用,当然也可以重写
 *
 *      2.静态方法,对应关键字static,就是接口中的静态方法,调用时可以用"接口名."调用
 *          注意: 用实现类的类名点是无法使用接口的静态方法的.
 *
 * 默认方法的语法:
 *      default 返回值类型 方法名(形参列表){
 *          //方法体
 *      }
 * 静态方法的语法:
 *      static 返回值类型 方法名(形参列表){
 *          //方法体
 *      }
 * 以上两种方法访问权限,默认也必须是public,没必要写出来
 *
 * 注意:
 *      1.接口中在目前环境下,几乎只会定义抽象方法,全局常量都很少见,有实现的方法就几乎是没有的
 *          Java8中引入了Lambda表达式和StreamAPI，接口中的默认方法和静态方法可以作为它们的实现，完成函数式编程。
 *          （这个仅了解，后面会讲Lambda表达式）
 *
 *      2.(了解)Java虽然不支持明面上的直接"多继承",但实际上Java是支持真正意义上的多继承的
 *
 *
 * @since 09:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        IA.testStatic();
        // IAImpl.
        IAImpl ia = new IAImpl();
        ia.test();
        ia.test2();
        ia.testDefault();
    }
}

interface IA {
    default void testDefault() {
        System.out.println("IA");
    }

    static void testStatic() {
    }
}

interface IB {
    default void test() {
        System.out.println("IB");
    }
}

interface IC {
    default void test2() {
        System.out.println("IC");
    }
}

interface ID {
    default void test() {
        System.out.println("ID");
    }
}
// com.cskaoyan.javase.oop3._1interface._2extend.IAImpl inherits unrelated defaults for test() from types com.cskaoyan.javase.oop3._1interface._2extend.IB and com.cskaoyan.javase.oop3._1interface._2extend.ID
class IAImpl implements IA, IC, ID {

}